/*
 * consulta.c
 *
 *  Created on: 29-dic-2009
 *      Author: pablo
 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "consulta.h"
//#include "message.h"
//#include "constantes.h"


unsigned int ultimaID;
unsigned char ultimoNombreID[LENGTH_MESSAGE_ID];

int	inicializarID(){
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'inicialidaID() de consulta.c --\n");
	//return 1;
#endif
	char c;
	int i;
	ultimaID = 0;
	for( i = 0 ; i < LENGTH_MESSAGE_ID ; ++i ) {
		c=(char) 0;
		ultimoNombreID[i] = c;
	}
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'inicialidaID() de consulta.c; salida=%i --\n", B_TRUE);
	//return 1;
#endif
	return B_TRUE;
}

int primerID() {
	//TODO preguntar a Fran, este metodo esta sacado de internete
	/* de internete */
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'primerID() de consulta.c --\n");
	//return 1;
#endif
	struct timeval t;
	unsigned int ini;
	int i,medio;
	char c;
	medio=LENGTH_MESSAGE_ID/2;
	gettimeofday( &t, NULL );
	ini = t.tv_usec;
	srand( ini );
	for( i = 0 ; i < LENGTH_MESSAGE_ID ; ++i ) {
		c=(char) (256.0*rand()/(RAND_MAX+1.0));
		ultimoNombreID[i] = c;
	}
	ultimoNombreID[medio] = 255;
	ultimoNombreID[LENGTH_MESSAGE_ID-1] = 0;

#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'primerID() de consulta.c; salida=%i --\n", B_TRUE);
	//return 1;
#endif

	return B_TRUE;
}



int siguienteID() {
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'siguienteID() de consulta.c --\n");
	//return 1;
#endif
	int i=14;
	int fin = B_FALSE;

	while(i>0 && fin!=B_TRUE){
		if( i != 8 ) {
			if( ultimoNombreID[i] != 255 ) {
				ultimoNombreID[i]=ultimoNombreID[i]+1;
				fin = B_TRUE;
			} else {
				ultimoNombreID[i] = 0;
			}
		}
		i--;
	}


#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'siguienteID() de consulta.c; salida=%i --\n", B_TRUE);
	//return 1;
#endif

	return B_TRUE;
}



int encontrarQuery (struct fileQuery *id, char *nombreArchivo, char *indiceArchivo, unsigned long long tam, struct sockaddr *address){
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'encontrarQuery() de consulta.c --\n");
	//return 1;
#endif
	int sal = B_FALSE;
	if (strlen(nombreArchivo)<TAM_MAX_NOMBRE_ARCHIVO && strlen(indiceArchivo)<TAM_MAX_NOMBRE_ARCHIVO){
		ultimaID++;
		id->id = ultimaID;
		id->tam = tam;
		bzero(&id->indiceArchivo,TAM_MAX_NOMBRE_ARCHIVO);
		bzero(&id->nombreArchivo,TAM_MAX_NOMBRE_ARCHIVO);
		sprintf (id->nombreArchivo,"%s",nombreArchivo);
		sprintf (id->indiceArchivo,"%s",indiceArchivo);
		if (address != NULL)
			memcpy (&id->address, address, sizeof (struct sockaddr));
		sal = B_TRUE;
	}
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'encontrarQuery() de consulta.c; salida=%i --\n", sal);
	//return 1;
#endif
	return sal;
}

int liberarQuery ( struct fileQuery *id){
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'liberarQuery() de consulta.c --\n");
	//return 1;
#endif
	if(id!=NULL){
		free (id);
	}
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'liberarQuery() de consulta.c; salida=%i --\n", B_TRUE);
	//return 1;
#endif
	return B_TRUE;
}


//struct message * rellenar_query( char * keyword , int sockfd) {
struct message * rellenarQuery( char *claves , int id ){
#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --Inicio en 'rellenarQuery() de consulta.c --\n");
	//return 1;
#endif
	struct queryMessage *consulta;
	struct messageHeader * cabecera;
	struct message * mensaje;

	consulta = malloc(sizeof( struct queryMessage ) );
	consulta->min_speed = VEL_MIN;
	consulta->search = strdup (claves);

	cabecera = malloc( sizeof( struct messageHeader ) );
	strncpy( cabecera->GUID, ultimoNombreID, LENGTH_MESSAGE_ID);
	siguienteID();
	/*
	unsigned char ttl;
	unsigned char hops;
	unsigned char payload_type;
	unsigned int payload_length;
	void *payload; // esto no lo he probado nunca pero SAN GOOGLE dice q es un puntero a algo generico, incluso a NULO si fuese necesacio
	 */

	cabecera->ttl = TTL_DEFECTO;
	cabecera->hops = 0;
	cabecera->payload_type = PAYLOAD_QUERY;
	cabecera->payload_length = strlen( claves ) + 1 + LENGTH_MINIMUM_SPEED;
	cabecera->payload = consulta;

	mensaje = malloc( sizeof( struct message ) );
	mensaje->sockfd = id;
	mensaje->header = cabecera;

#ifdef DEBUG_CONSULTA
	fprintf(stderr,"\t --fin en 'rellenarQuery() de consulta.c; salida=estructura de Mensaje --\n");
	//return 1;
#endif

	return mensaje;
}
